package com.example.invoker.schedule;

import com.example.invoker.exception.BoardException;
import com.example.invoker.utils.ZonedDateUtil;
import org.apache.commons.lang.StringUtils;


import java.time.ZonedDateTime;
import java.util.Collection;


/**
 *    一个人至少拥有一个梦想，有一个理由去坚强。
 *    心若没有栖息的地方，到哪里都是在流浪。
 *
 * @Author huaiyu yin
 * @Date 2021/6/30 2:32 下午
 * @Version 1.0
 */
public abstract class AbstractSyncService {


    //基础同步时间
    public String startDate;
    public String endDate;
    /**
     * 同步数据流程
     * 1。数据入参数校验
     * 2。获取数据校验
     * 3。获取数据组装
     * 4。获取数据保存
     * @param startDate
     * @param endDate
     */

    public  abstract void process(String startDate, String endDate);

    /**
     * 参数验证
     * 1。存在两个参数验证参数合法性开始日期大于等于结束日期
     * 2。只存在一个参数，必须是开始日期，则判断是开始日期和结束日期相同为传入的开始日期
     * 3。传入参数为空，自动获取当前的日期前一天的日期作为开始和结束日期
     * @param startDate
     * @param endDate
     */
    public  void validParam(String startDate, String endDate){
        //只存在开始日期，结束日期相同为传入的开始日期前一天
        if (StringUtils.isNotBlank(startDate) && StringUtils.isBlank(endDate) ) {
            ZonedDateTime yesterday = ZonedDateUtil.convertDateStrToZonedDateTime(ZonedDateUtil.TIMEZONE_ASIN_SHANGHAI,startDate).plusDays(-1);
            endDate = startDate;
            startDate = ZonedDateUtil.convertZoneTimeToStr(yesterday, ZonedDateUtil.dayFormatterStr);
        }

        //参数为空，自动获取当前的日期前一天的日期作为开始和结束日期
        if (StringUtils.isBlank(startDate )&&StringUtils.isNotBlank(endDate)) {
            ZonedDateTime theday = ZonedDateUtil.today(ZonedDateUtil.TIMEZONE_ASIN_SHANGHAI).plusDays(-1);
            endDate = ZonedDateUtil.convertZoneTimeToStr(theday, ZonedDateUtil.dayFormatterStr);
            startDate = ZonedDateUtil.convertZoneTimeToStr(theday.plusDays(-1), ZonedDateUtil.dayFormatterStr);
        }

        //存在两个参数验证参数合法性开始日期大于等于结束日期
        if (ZonedDateUtil.convertStrToDate(startDate, ZonedDateUtil.dayFormatterStr).compareTo(ZonedDateUtil.convertStrToDate(endDate, ZonedDateUtil.dayFormatterStr)) > 0) {
            throw new BoardException("开始时间不能大于结束时间!");
        }


        setStartDate(startDate);
        setEndDate(endDate);

    }
    /**
     * 数据处理
     * 1。源数据获取
     * 2。源数据处理
     * 3。数据封装
     * @return
     */
    public abstract void assemblyData();

    /**
     * 获取数据合法验证
     * todo  预留可能存在在数据问题的修正
     */
    public abstract void validation();

    /**
     * 数据保存
     */
    public abstract void save(Collection entityList);

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }


}
